]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
st/theme-node: Forget properties cache on stylesheet change
authorDaniel van Vugt <daniel.van.vugt@canonical.com>
Thu, 28 Mar 2024 06:45:26 +0000 (14:45 +0800)
committerSimon McVittie <smcv@debian.org>
Fri, 8 Aug 2025 08:19:26 +0000 (09:19 +0100)
To avoid `node->properties` pointing to freed memory after each
`st_theme_unload_stylesheet`, flush the cache that is `node->properties`.
They will be reloaded as soon as they are required by `ensure_properties`.

And yes `node->stylesheets_changed_id` already existed, but was unused.

Why not just fix Croco? Croco does not use proper reference counting
everywhere it should, and retrofitting it would be difficult due to the
recursive nature of `CRDeclaration`.

Includes commit:
st/theme-node: Forget properties cache before unref'ing the theme
Which the properties point into.

Forwarded: https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3252
Bug: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/7339
Bug-Ubuntu: https://bugs.launchpad.net/bugs/2069559
Bug-Dash-to-Dock: https://github.com/micheleg/dash-to-dock/issues/2179

Gbp-Pq: Name st-theme-node-Forget-properties-cache-on-stylesheet-chang.patch

src/st/st-theme-node-private.h
src/st/st-theme-node.c

index d95284e201af93ea76902d45cee12b755d761fbf..2d5065f05f7b8ad7816fdce143d2e443e624172a 100644 (file)
@@ -104,7 +104,7 @@ struct _StThemeNode {
   int box_shadow_min_width;
   int box_shadow_min_height;
 
-  guint stylesheets_changed_id;
+  gulong stylesheets_changed_id;
 
   CoglTexture *border_slices_texture;
   CoglPipeline *border_slices_pipeline;
index 4e0111d4f94b495a6aecfaf52dfc0ddeba330398..8d81693f64c72da1d1b9d86f6e1e71fc9b61664c 100644 (file)
@@ -75,6 +75,10 @@ maybe_free_properties (StThemeNode *node)
       cr_declaration_destroy (node->inline_properties);
       node->inline_properties = NULL;
     }
+
+  g_clear_signal_handler (&node->stylesheets_changed_id, node->theme);
+
+  node->properties_computed = FALSE;
 }
 
 static void
@@ -102,6 +106,7 @@ st_theme_node_dispose (GObject *gobject)
 
   st_theme_node_paint_state_free (&node->cached_state);
 
+  maybe_free_properties (node);
   g_clear_object (&node->theme);
 
   G_OBJECT_CLASS (st_theme_node_parent_class)->dispose (gobject);
@@ -117,8 +122,6 @@ st_theme_node_finalize (GObject *object)
   g_strfreev (node->pseudo_classes);
   g_free (node->inline_style);
 
-  maybe_free_properties (node);
-
   g_clear_pointer (&node->font_desc, pango_font_description_free);
 
   g_clear_pointer (&node->box_shadow, st_shadow_unref);
@@ -472,6 +475,16 @@ ensure_properties (StThemeNode *node)
           node->n_properties = properties->len;
           node->properties = (CRDeclaration **)g_ptr_array_free (properties, FALSE);
         }
+
+      if (!node->stylesheets_changed_id)
+        {
+          node->stylesheets_changed_id =
+            g_signal_connect_object (node->theme,
+                                     "custom-stylesheets-changed",
+                                     G_CALLBACK (maybe_free_properties),
+                                     G_OBJECT (node),
+                                     G_CONNECT_SWAPPED);
+        }
     }
 }